//package yzrilyzr.simplesynth.app;
//import static yzrilyzr.simplesynth.app.AppInstance.replaceableInstrument;
//import static yzrilyzr.simplesynth.synth.envelopers.EnvUtil.LINE;
//import static yzrilyzr.simplesynth.synth.envelopers.EnvUtil.Pow;
//import static yzrilyzr.simplesynth.synth.generators.drum.SimpleDrumSet.risset;
//import static yzrilyzr.simplesynth.synth.source.AmplitudeSources.ConstAmp;
//import static yzrilyzr.simplesynth.synth.source.AmplitudeSources.ConstFreq;
//import static yzrilyzr.simplesynth.synth.source.AmplitudeSources.PWMAmp;
//import static yzrilyzr.simplesynth.synth.source.AmplitudeSources.SineAmp;
//
//import java.text.MessageFormat;
//import java.util.HashSet;
//
//import yzrilyzr.ast.ASTEvalCallback;
//import yzrilyzr.ast.ASTEvalContext;
//import yzrilyzr.ast.ASTIdentifier;
//import yzrilyzr.ast.ASTJava;
//import yzrilyzr.ast.ASTNode;
//import yzrilyzr.ast.ASTNumber;
//import yzrilyzr.ast.ASTObject;
//import yzrilyzr.ast.ASTParser;
//import yzrilyzr.ast.ASTRoot;
//import yzrilyzr.simplesynth.synth.MeanFilterSrc;
//import yzrilyzr.simplesynth.synth.envelopers.AHDSREnvelop;
//import yzrilyzr.simplesynth.synth.envelopers.TimeEnvelop;
//import yzrilyzr.simplesynth.synth.generators.drum.SimpleDrumAmp;
//import yzrilyzr.simplesynth.synth.generators.noise.Noise4Bit;
//import yzrilyzr.simplesynth.synth.generators.noise.NoiseSrc;
//import yzrilyzr.simplesynth.synth.generators.physic.Fiddle;
//import yzrilyzr.simplesynth.synth.generators.physic.KarplusStrongSrc;
//import yzrilyzr.simplesynth.synth.generators.physic.PianoSrc;
//import yzrilyzr.simplesynth.synth.generators.physic.Sakura;
//import yzrilyzr.simplesynth.synth.generators.physic.Sitar;
//import yzrilyzr.simplesynth.synth.generators.pulse.Pulse;
//import yzrilyzr.simplesynth.synth.generators.pulse.SawWave;
//import yzrilyzr.simplesynth.synth.generators.pulse.SquareWave;
//import yzrilyzr.simplesynth.synth.generators.pulse.TriWave;
//import yzrilyzr.simplesynth.synth.generators.sine.AHarmonicWave;
//import yzrilyzr.simplesynth.synth.generators.sine.ASineHarmonicWaveTable;
//import yzrilyzr.simplesynth.synth.generators.sine.SineBasePowHarmonicWave;
//import yzrilyzr.simplesynth.synth.generators.sine.SineHarmonicWave;
//import yzrilyzr.simplesynth.synth.generators.sine.SineHarmonicWaveTable;
//import yzrilyzr.simplesynth.synth.generators.sine.SineWave;
//import yzrilyzr.simplesynth.synth.generators.sine.SineWaveTable;
//import yzrilyzr.simplesynth.synth.source.AmpBuilder;
//import yzrilyzr.simplesynth.synth.source.NoteProcessor;
//import yzrilyzr.util.AndroidUtil;
//
//public class Parser{
//	static final ASTEvalCallback callback=new ASTEvalCallback(){
//		@Override
//		public ASTNode callFunction(ASTIdentifier name,ASTNode[] par){
//			switch(name.value){
//				case "mul":
//					return par[1];
//				case "max":
//					return new ASTNumber(Math.max(((ASTNumber)par[0]).doubleValue(),
//												  ((ASTNumber)par[1]).doubleValue()));
//				case "print":
//					System.out.println("<Print>"+par[0]);
//					return null;
//				case "Pow":
//					return new ASTObject(Pow(((ASTNumber)par[0]).floatValue()));
//				case "PWMAmp":
//					return new ASTObject(PWMAmp(((ASTNumber)par[0]).doubleValue(),
//												((ASTNumber)par[1]).doubleValue(),
//												((ASTNumber)par[2]).doubleValue(),
//												((ASTNumber)par[3]).doubleValue(),
//												((ASTNumber)par[4]).doubleValue()));
//				case "SineAmp":
//					return new ASTObject(SineAmp(((ASTNumber)par[0]).doubleValue()));
//				case "ConstFreq":
//					return new ASTObject(ConstFreq(((ASTNumber)par[0]).doubleValue()));
//				case "ConstAmp":
//					return new ASTObject(ConstAmp(((ASTNumber)par[0]).doubleValue()));
//				case "risset":
//					return new ASTObject(risset());
//				default:
//					throw new ASTParser.EvalException(
//							MessageFormat.format("Function {0} undefined",name));
//			}
//		}
//		@Override
//		public Object newObject(ASTIdentifier name,ASTNode[] par){
//			try{
//				switch(name.value){
//					case "SineWave":
//						return ASTJava.newInstance(SineWave.class,par);
//					case "Pulse":
//						return ASTJava.newInstance(Pulse.class,par);
//					case "AmpBuilder":
//						return ASTJava.newInstance(AmpBuilder.class,par);
//					case "SawWave":
//						return ASTJava.newInstance(SawWave.class,par);
//					case "SquareWave":
//						return ASTJava.newInstance(SquareWave.class,par);
//					case "TriWave":
//						return ASTJava.newInstance(TriWave.class,par);
//					case "NoiseSrc":
//						return ASTJava.newInstance(NoiseSrc.class,par);
//					case "Noise4Bit":
//						return ASTJava.newInstance(Noise4Bit.class,par);
//					case "AHarmonicWave":
//						return ASTJava.newInstance(AHarmonicWave.class,par);
//					case "ASineHarmonicWaveTable":
//						return ASTJava.newInstance(ASineHarmonicWaveTable.class,par);
//					case "SimpleDrumAmp":
//						return ASTJava.newInstance(SimpleDrumAmp.class,par);
//					case "SineHarmonicWave":
//						return ASTJava.newInstance(SineHarmonicWave.class,par);
//					case "SineBasePowHarmonicWave":
//						return ASTJava.newInstance(SineBasePowHarmonicWave.class,par);
//					case "SineHarmonicWaveTable":
//						return ASTJava.newInstance(SineHarmonicWaveTable.class,par);
//					case "KarplusStrongSrc":
//						return ASTJava.newInstance(KarplusStrongSrc.class,par);
//					case "PianoSrc":
//						return ASTJava.newInstance(PianoSrc.class,par);
//					case "AHDSREnvelop":
//						return ASTJava.newInstance(AHDSREnvelop.class,par);
//					case "TimeEnvelop":
//						return ASTJava.newInstance(TimeEnvelop.class,par);
//					case "SineWaveTable":
//						return ASTJava.newInstance(SineWaveTable.class,par);
//					case "MeanFilterSrc":
//						return ASTJava.newInstance(MeanFilterSrc.class,par);
//					case "Fiddle":
//						return ASTJava.newInstance(Fiddle.class,par);
//					case "Sitar":
//						return ASTJava.newInstance(Sitar.class,par);
//					case "Sakura":
//						return ASTJava.newInstance(Sakura.class,par);
//					case "StringControl":
//						return ASTJava.newInstance(Sakura.StringControl.class,par);
//					case "ResonatorControl":
//						return ASTJava.newInstance(Sakura.ResonatorControl.class,par);
//					default:
//						throw new ASTParser.EvalException(
//								MessageFormat.format("Class {0} undefined",name));
//				}
//			}catch(Exception e){
//				e.printStackTrace();
//				throw new RuntimeException();
//			}
//		}
//		@Override
//		public ASTNode callMethod(ASTObject object,ASTIdentifier name,ASTNode[] par,Object o){
//			try{
//				return ASTJava.callMethod(object,name,par,o);
//			}catch(Exception e){
//				e.printStackTrace();
//				throw new RuntimeException();
//			}
//		}
//		@Override
//		public ASTNode getVariable(ASTIdentifier name){
//			switch(name.value){
//				case "sampleRate":
//					return new ASTNumber(AppInstance.sampleRate);
//				case "LINE":
//					return new ASTObject(LINE);
//				default:
//					throw new ASTParser.EvalException(
//							MessageFormat.format("Var {0} undefined",name));
//			}
//		}
//	};
//	public static int[] parseInts(String replaceInst){
//		String[] es=replaceInst.split(",");
//		HashSet<Integer> al=new HashSet<Integer>();
//		for(String a: es){
//			if(a.contains("～")){
//				String[] bb=a.split("～");
//				int q=Integer.parseInt(bb[0]);
//				int w=Integer.parseInt(bb[1]);
//				for(int i=q;i<=w;i++) al.add(i);
//			}
//			else{
//				int q=Integer.parseInt(a);
//				al.add(q);
//			}
//		}
//		int[] es1=new int[al.size()];
//		Integer[] es2=al.toArray(new Integer[0]);
//		for(int i=0;i<es1.length;i++){
//			es1[i]=es2[i];
//		}
//		return es1;
//	}
//	public static NoteProcessor parse(String s,int... ids){
//		try{
//			ASTRoot node=ASTParser.parse(s);
//			ASTEvalContext ctx=new ASTEvalContext();
//			node=(ASTRoot)node.eval(ctx,callback);
//			NativePlayer.resetLimiter();
//			NoteProcessor ampSrc=(NoteProcessor)((ASTObject)node.nodes.get(0)).object;
//			for(int id: ids){
//				//Channel channel=AppInstance.mixer.getChannel(id);
//				//if(channel==null) AppInstance.mixer.setChannel(id,channel=new Channel(ampSrc));
//				//else channel.setNoteProcessor(ampSrc);
//				System.out.println(ampSrc);
//			}
//		}catch(Exception e){
//			AndroidUtil.toast("表达式有误");
//			e.printStackTrace();
//		}
//		return null;
//	}
//	public static NoteProcessor replace(String s,int... ids){
//		try{
//			ASTRoot node=ASTParser.parse(s);
//			ASTEvalContext ctx=new ASTEvalContext();
//			node=(ASTRoot)node.eval(ctx,callback);
//			NativePlayer.resetLimiter();
//			NoteProcessor ampSrc=(NoteProcessor)((ASTObject)node.nodes.get(0)).object;
//			for(int id: ids){
//				replaceableInstrument.put(id,ampSrc);
//			}
//		}catch(Exception e){
//			AndroidUtil.toast("表达式有误");
//			e.printStackTrace();
//		}
//		return null;
//	}
//}
